package agenda;

import java.io.*;
import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * Classe principal da agenda
 * 
 * @author emerson borges - emerson.borges@ccc.ufcg.edu.br
 * @author rafael lima - rafael.ufcg10@gmail.com
 */
public class AgendaMultitudo extends Agenda {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static Arquivo manipuladorDeArquivos;
	private static MenuPrincipal opcao;
	private static Escolha escolha;
	private static MenuPrincipal opcoes[] = { MenuPrincipal.VISUALIZAR_PERFIL,
			MenuPrincipal.ATUALIZAR_PERFIL, MenuPrincipal.ADICIONAR_EVENTO,
			MenuPrincipal.VISUALIZAR_CONTATOS,
			MenuPrincipal.CADASTRAR_CONTATOS,
			MenuPrincipal.ADICIONAR_CONTATOS_A_EVENTOS,
			MenuPrincipal.ATUALIZAR_CONTATOS, MenuPrincipal.REMOVER_CONTATOS,
			MenuPrincipal.BUSCAR_EVENTOS_POR_CONTATO, MenuPrincipal.SAIR };
	private static Escolha escolhas[] = { Escolha.SIM, Escolha.NAO };

	private static MenuPrincipal validarOpcao(int opcao) throws Exception {
		if (0 <= opcao && opcao < opcoes.length) {
			return opcoes[opcao - 1];
		} else {
			throw new Exception("Opcao invalida. Digite o valor pedido entre parenteses.");

		}	

	}
	

	private static Escolha validarEscolha(int escolha) throws Exception {
		if (escolha == 1 || escolha == 2) {
			return escolhas[escolha - 1];
		} else {
			throw new Exception("Escolha invalida. Digite o valor pedido entre parenteses.");

		}

	}

	private static void limpar() {
		for (int i = 0; i < 10; i++) {
			System.out.println();
		}
	}

	private static void exibirMenuPrincipal() {
		System.out.println("Menu Principal: \n" + "(1) Visualizar Perfil\n"
				+ "(2) Atualizar Perfil\n" + "(3) Adicionar Evento\n"
				+ "(4) Visualizar Contatos\n" + "(5) Cadastrar Contatos\n"
				+ "(6) Adicionar Contatos A Eventos\n"
				+ "(7) Atualizar Contatos\n" + "(8) Remover Contatos\n"
				+ "(9) Buscar Eventos Por Contato\n" + "(10) Sair\n");
	}

	private void exibirMenuEvento() {
		System.out.println();

	}

	private void exibirMenuContatos() {
		// TODO Auto-generated method stub

	}

	public void solicitarCadastro() throws Exception {
		int escolha2;
		boolean condicao = true;
		Scanner entrada = new Scanner(System.in);

		do {
			System.out.println("Voce ainda nao se cadastrou. Gostaria de fazer isso agora?");
			System.out.println("(1) para SIM \n(2) para NAO");
			try {
				escolha2 = entrada.nextInt();
				escolha = AgendaMultitudo.validarEscolha(escolha2);
				condicao = false;
			} catch (InputMismatchException ex) {
				System.err.println("Valor de tipo invalido. Digite um dos numeros entre parentesis.");
				entrada.nextLine();
			} catch (Exception e) {
				System.out.println(e.getMessage());
				entrada.nextLine();
			}

		} while (condicao);			
		switch (escolha) {
		
		case SIM:
			limpar();
			atualizarUsuario();
			System.out.println("Cadastro realizado com sucesso!");
			break;

		case NAO:
			limpar();
			break;
		}
			

	}

	public void atualizarUsuario() {
		Scanner entrada = new Scanner(System.in);
		String nome = null, email = null, descricao = null;
		String novoNomeDoArquivo = null;
		boolean condicao = true;
		while (condicao) {
			try {
				System.out.println("Digite seu nome: ");
				nome = entrada.next();
				System.out.println("Digite seu email: ");
				email = entrada.next();
				System.out.println("Digite uma descricao para voce: ");
				descricao = entrada.next();
				atualizarPerfilDoUsuario(nome, descricao, email);

			} catch (InputMismatchException ex) {
				System.err.println("Dados de tipo invalido.");
				System.out.println("Digite novamente.");
				
			} catch (Exception ex) {
				System.out.println(ex.getMessage());
				System.out.println("Digite novamente.");
				
			}
			novoNomeDoArquivo = String.format("%s.txt", nome);

			for (String arq : Arquivo.getDiretorio().list()) {
				if (!(arq.equals(novoNomeDoArquivo))) {
					manipuladorDeArquivos.setArquivoSaida(novoNomeDoArquivo);
					manipuladorDeArquivos.escreverObjetoNoArquivo(
							manipuladorDeArquivos.getArquivoSaida(),
							getUsuario());
					manipuladorDeArquivos.fecharArquivoSaida();
					condicao = false;

				} else {
					System.out.println("Ja existe um usuario com o mesmo nome.");
					System.out.println("Por favor, digite um outro nome.");
					break;
				}
			}

		}

	}

	public static void visualizarPerfil() {
		Usuario usuario = null;
		manipuladorDeArquivos.abrirArquivoEntrada(manipuladorDeArquivos
				.getNomeDoArquivoUsuario());
		usuario = (Usuario) manipuladorDeArquivos
				.lerObjetoDoArquivo(manipuladorDeArquivos.getArquivoEntrada());
		manipuladorDeArquivos.fecharArquivoEntrada();
		System.out.println(usuario);

	}

	public static void main(String[] args) {

		Scanner entrada = new Scanner(System.in);
		AgendaMultitudo agenda = null;
		boolean condicao = true;
	

		for (int i = 0; i < 21; i++) {
			if (i == 10) {
				System.out.print(" Agenda-Multitudo ");
				continue;
			}
			System.out.print("*");
		}

		System.out.println();
		
		int escolha1 = 0;
		
		// primeiro acesso
		
		do {
			System.out.println("Primeiro Acesso? ");
			System.out.println("(1) para SIM \n(2) para NAO");
			try {
				escolha1 = entrada.nextInt();
				escolha = AgendaMultitudo.validarEscolha(escolha1);
				condicao = false;
			} catch (InputMismatchException ex) {
				System.err.println("Valor de tipo invalido. Digite um dos numeros entre parentesis.");
				entrada.nextLine();
			} catch (Exception e) {
				System.out.println(e.getMessage());
				entrada.nextLine();
			}
			
		} while (condicao);
					
		
		switch (escolha) {

		case SIM:
			limpar();
			try {
				manipuladorDeArquivos = new Arquivo();
			} catch (Exception ex) {
				System.err.println("Erro na configuracao do diretorio.");
			}

			if (!(Arquivo.isDiretorio())) {
				if (Arquivo.criarDiretorio()) {
					manipuladorDeArquivos.abrirArquivoSaida( manipuladorDeArquivos.getNomeDoArquivoUsuario() );
				}
				try {
					agenda = new AgendaMultitudo();
					agenda.criarPerfilVazio();
					manipuladorDeArquivos.escreverObjetoNoArquivo( manipuladorDeArquivos.getArquivoSaida(),
							agenda.getUsuario() );
					manipuladorDeArquivos.fecharArquivoSaida();
					agenda.solicitarCadastro();
				} catch (Exception ex) {
					System.out.println(ex.getMessage());
				}
			} else {
				agenda = new AgendaMultitudo();
				try {
					agenda.solicitarCadastro();
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}

			}
			
		case NAO:
			limpar();
			int opcao1 = 0;
			
			do {
				exibirMenuPrincipal();
				System.out.println("Opcao:");
				try {
					opcao1 = entrada.nextInt();
					opcao = AgendaMultitudo.validarOpcao(opcao1);
					
				} catch (InputMismatchException ex) {
					System.err.println("Valor de tipo invalido."
							+ " Digite um dos numeros entre parentesis.");
					entrada.nextLine();
					condicao = true;
				} catch (Exception ex) {
					System.out.println(ex.getMessage());
					entrada.nextLine();
					condicao = true;
				}				
				
			} while (condicao);
			
			
			switch (opcao) {
			case VISUALIZAR_PERFIL:
				limpar();
				visualizarPerfil();
				break;
			case ATUALIZAR_PERFIL:
				limpar();
				// atualizarPerfil();
				break;
			case ADICIONAR_EVENTO:
				limpar();
				// adicionarEventos();
				break;
			case VISUALIZAR_CONTATOS:
				limpar();
				// visualizarContatos();
				break;
			case CADASTRAR_CONTATOS:
				limpar();
				// cadastrarContatos();
				break;
			case ADICIONAR_CONTATOS_A_EVENTOS:
				limpar();
				// adicionarContatos_A_Eventos();
				break;
			case ATUALIZAR_CONTATOS:
				limpar();
				// atualizarContatos();
				break;
			case REMOVER_CONTATOS:
				limpar();
				// removeContatos();
				break;
			case BUSCAR_EVENTOS_POR_CONTATO:
				limpar();
				// buscarEventosPorContato();
				break;
			case SAIR:
				limpar();
				System.out.println("Ate a proxima!");
				System.exit(0);
			} // fim do switch 2
			
		} // fim do switch 1	

		

	} // fimdo metodo

} // fim da classe